#include "liste.h"

void initialise(Liste *l)
{
  if(l)
    {
      l->prem = NULL;
      l->last = NULL;
    }
}

int estVide(const Liste * l)
{
  if(l->prem == NULL)
    return 1;
  return 0;
}

unsigned int nbElements(const Liste *l)
{
  Cellule *c = l->prem;
  unsigned int i = 0;
  while(c)
    {
      i++;
      c = c->suivant;
    }
  return i;
}

void affichageListeGaucheDroite(const Liste *l)
{
  Cellule *c = l->prem;
  printf("Affichage de la liste de Gauche à Droite\n");
  while(c)
    {
      printf("%d", (int)c->info);
      if(c != l->last)
	printf(", ");
      c = c->suivant;
    }
  printf("\n");
}

void affichageListeDroiteGauche(const Liste *l)
{
  Cellule *c = l->last;
  printf("Affichage de la liste de Droite à Gauche\n");
  while(c)
    {
      printf("%d", (int)c->info);
      if(c != l->prem)
	printf(", ");
      c = c->precedent;
    }
  printf("\n");
}

void ajoutEnTete(void * e, Liste *l)
{
  Cellule *c = (Cellule *) malloc (1*sizeof(Cellule));
  c->info = e;
  c->suivant = l->prem;
  if(l->prem)
    l->prem->precedent = c;
  c->precedent = NULL;
  l->prem = c;
  if(l->last == NULL)
    l->last = c;
}

void ajoutEnQueue(void *e, Liste *l)
{
  Cellule *c = (Cellule *) malloc (1*sizeof(Cellule));
  c->info = e;
  c->suivant = NULL;
  c->precedent = l->last;
  if(l->last)
    l->last->suivant = c;
  l->last = c;
  if(l->prem == NULL)
    l->prem = c;
}

void suppressionEnTete(Liste *l)
{
  Cellule *c = l->prem;
  l->prem = c->suivant;
  free(c);
  if(l->prem)
    l->prem->precedent = NULL;
}

void videListe(Liste *l)
{
  while(!estVide(l))
    suppressionEnTete(l);
}

void testament(Liste *l)
{
  videListe(l);
}

void affectation(Liste *l1, const Liste *l2)
{
  Cellule *c2 = l2->prem;
  if(!estVide(l1))
    videListe(l1);
  while(c2)
    {
      ajoutEnQueue(c2->info, l1);
      c2 = c2->suivant;
    }
}

int rechercheElement(void * e, const Liste *l)
{
  int i = 0;
  Cellule *c = l->prem;
  do{
    if(c->info == e)
      return i;
    i++;
    c = c->suivant;
  }while(c);
  return -1;
}

void insererElement(void * e, Liste *l, unsigned int position)
{
  unsigned int i = 0, taille = nbElements(l);
  Cellule *c = l->prem;

  if(position == 0)
    {
      ajoutEnTete(e, l);
    }
  else if(taille == position)
    {
      ajoutEnTete(e, l);
    }
  else
    {
      Cellule *cIns = (Cellule *) malloc (1*sizeof(Cellule));
      for(i = 1; i < position; i++)
	{
	  c = c->suivant;
	}
      cIns->info = e;
      cIns->suivant = c->suivant;
      cIns->precedent = c;
      c->suivant = cIns;
      cIns->suivant->precedent = cIns;
    }
}
